package com.tedu.api.thread;

import com.tedu.api.io.FilterAPI;
import org.junit.Test;

import java.io.File;
import java.io.FileFilter;
import java.util.*;
import java.util.function.BiConsumer;
import java.util.function.Consumer;

/**
 * Lambda表达式 -->() -->{} [接口/抽象--匿名内部类]
 *                         【集合遍历--匿名内部类】
 * Collection--->List：存重复元素并且有序【保存数据结构一致】
 *               Set：存无序并且不重复【保存数据结构一致】
 *               Queue：队列结合业务
 * Map-------------->HashMap：键值对存储
 */
public class LambdaDemo {
    @Test
    public void testList() {
        List<String> list = new ArrayList<>();
        list.add("白洋淀");
        list.add("正定古城");
        list.add("河头老街");
        list.add("白石山");
        //集合3种遍历方式 普通for 增强for forEach方法
        for (String str : list) {
            System.out.println("增强for:" + str);
        }
        //支持forEach方法:遍历集合元素
        //Consumer接口针对List集合提供接口：功能获取list集合元素
        //accept() 获取list集合的所有元素
        list.forEach(new Consumer<String>() {
            public void accept(String s) {
                System.out.println("consumer接口遍历方案" + s);
            }
        });
        //支持forEach方法：遍历集合元素【Consumer 匿名内部类】
        //编写lambda表达式写法
        list.forEach(s -> System.out.println("Lambda接口遍历方案" + s));
    }

    @Test
    public void testMap() {
        //创建Map集合:键值对
        Map<Integer, String> map = new HashMap<>();
        map.put(1, "唐山");
        map.put(2, "石家庄");
        map.put(3, "秦皇岛");
        map.put(4, "邯郸");
        //遍历集合：普通for 增强for forEach（BiConSummer接口--匿名内部类）
        //键值对-->一组Entry对象
        //BiConSummer接口---获取每组Entry对象---accept（）获取一组Entry对象
        map.forEach(new BiConsumer<Integer, String>() {
            public void accept(Integer integer, String s) {
                System.out.println("键：" + integer + "值：" + s);
            }
        });
        //使用Lambda表达式
        map.forEach((integer, s) -> System.out.println("lambda表达式：" + "键：" + integer + "值：" + s));
    }


    /**
     * 作业： 1.使用Lambda表达式完成 Thread线程创建
     * 2.使用Lambda表达式完成 Runnable线程创建
     * 3.IO流---File类：listFile（FileFilter接口）【5行代码】
     * 目标：【io包下FilterAPI类】实现使用Lambda表达式完成
     * 4.3.IO流---File类：listFile（FileFilter接口）【2行代码】
     * 目标：【io包下FilterAPI类】实现使用Lambda表达式完成
     * 5.集合：改成lambda写法
     * 目标：【List包下ListAPI类下单元测试：testComparator】
     * LambdaDemo类下--完成作业
     *
     * @LambdaHomework1
     * @LambdaHomework2
     */
    @Test
    public void LambdaHomework1() {
        //1.使用Lambda表达式完成 Thread线程创建
        //Thread类 Java定义线程类--具备启动start----
        //Thread类 封装Runnable类--线程run运行
        Thread t1 = new Thread(() -> {
            for (int i = 0; i < 1000; i++) {
                System.out.println("学啊");
            }
        });
        t1.start();
    }

    @Test
    public void LambdaHomework2() {
        // 2.使用Lambda表达式完成 Runnable线程创建
        //①创建Runnable接口
        Runnable mr1 = (() -> {
            for (int i = 0; i < 1000; i++) {
                System.out.println("牛蛙饭你发");
            }
        });
        //②创建Thread线程类---start（）
        Thread t2 = new Thread(mr1);
        //③启动线程
        t2.start();
    }

//    @Test
//    public void LambdaHomework3() {0
//        //3.IO流---File类：listFile（FileFilter接口）【5行代码】
//        //    目标：【io包下FilterAPI类】实现使用Lambda表达式完成
//        File file = new File("." + File.separator + "API");
//        //匿名内部类 替换子类继承FileFilter
//        FileFilter my=(pathname)->{return pathname.getName().startsWith("s");};
//        //2.获取文件夹下所有“子项：文件夹下包括所有文件和文件夹“
//        File[] subs = file.listFiles(my);
//        //3.打印子项下所有名字
//        for(int i=0;i<subs.length;i++){//i 下标 从0开始
//            System.out.println("所有的文件和文件夹的名"+subs[i].getName());
//        }
//
//    }


//    @Test
//    public void LambdaHomework4 () {
//        //4.3.IO流---File类：listFile（FileFilter接口）【2行代码】
//        // 目标：【io包下FilterAPI类】实现使用Lambda表达式完成
//        for(File f:new File("."+File.separator+"API").listFiles((pathname)->
//        {return pathname.getName().startsWith("s");})){
//            System.out.println("遍历后过滤完成："+f);
//        }
//    }

    @Test
    public void LambdaHomework5 () {
        //  5.集合：改成lambda写法
        // 目标：【List包下ListAPI类下单元测试：testComparator】
        List<String> list=new ArrayList<>();
        list.add("阿西吧");
        list.add("腰细");
        list.add("搜得系内");
        Comparator<String> com= (o1, o2) -> o1.length()-o2.length();
        Collections.sort(list);
        System.out.println("排序后集合："+list);

    }
}

